﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ParametresValeurs
{
    class Program
    {
        static void Main(string[] args)
        {
            int a=10, b=20,c;
            c=Somme1(a,b);
            Console.WriteLine("a={0},b={1},c={2}", a, b, c);

            a = 10; b = 20; c = 0;
            c=Somme2(a,b);
            Console.WriteLine("a={0},b={1},c={2}", a, b, c);

            a = 10; b = 20; c = 0;
            c = Somme2Ref(ref a, b);
            Console.WriteLine("a={0},b={1},c={2}", a, b, c);

            int m,n=20,k; //m n'est pas initialisé
            k = Somme2Out(out m, n);
            Console.WriteLine("a={0},b={1},c={2}", m, n, k);

            int m1=10, n1 = 20, k1; //m est initialisé
            k1 = Somme2Out(out m1, n1);
            Console.WriteLine("a={0},b={1},c={2}", m1, n1, k1);
            //Dans les deux précédents appels la valeur de m est la même : m = 100 (recopie de la valeur locale x=100).

            Console.ReadKey();

        }

        static int Somme1(int x, int y)
        {
            return x+y;
        }

        static int Somme2(int x, int y)
        {
            x = 100; //// c'est la copie locale du paramètre x qui est modifiée !
            return x + y;
        }

        static int Somme2Ref(ref int x, int y)
        {
            x = 101; // la valeur de x est modifié durablement
            return x + y;
        }


        //Dans un passage par résultat, le paramètre formel est traité comme une variable locale dont la valeur initiale est non définie. 
        //A la fin de l'exécution de la méthode la valeur résultante est renvoyée dans la variable effective quelle que soit sa localisation. 
        static int Somme2Out(out int x, int y)
        {//Bien que les variables passées en tant qu'arguments out n'aient pas besoin d'être initialisées avant d'être passées, 
            //la méthode appelée doit assigner une valeur avant le retour de la méthode.
            x = 100; // la valeur local de x est initialisé //la valeur résultante est renvoyée dans la variable effective
            return x + y;
        }
       
    }
}
